                                                                                                                                                                                                                                                                                                                   #ifndef GENERAL_DEFINE_H
#define GENERAL_DEFINE_H


#include "../alLib/Eigen/Dense"


#ifndef soapStub_H
/**
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
//#include  "gSoapFoundation/soapStub.h"
#endif


#define YEAR_CONST    31536000  //365*24*60*60秒
#define MONTH_CONST   2592000  //30*24*60*60秒
#define DAY_CONST       86400  //24*60*60秒
#define HOUR_CONST      3600   //60*60秒
#define MINUTE_CONST     60    //60秒

#define GLOBAL_SYSTEM_FILE    "/tcrwork/linuxController/trunk/TcrController/data/globalConfig/systemInfo/systemInfo.dat"
#define GLOBAL_BASEDATA "/tcrwork/linuxController/trunk/TcrController/data/globalConfig/systemInfo/baseData.ini"
#define GLOBAL_ROBOT_CONFIG     "/tcrwork/linuxController/trunk/TcrController/data/globalConfig/robots.xml";
#define GLOBAL_START_TYPE   "/tcrwork/linuxController/trunk/TcrController/data/globalConfig/startType/startType.xml"


#define IP_FILE   "/etc/network/interfaces"
#define MAC_FILE     "/etc/rc.local"
#define DNS_FILE    "/etc/resolvconf/resolv.conf.d/base"

#define ROBOT_COMMON_PATH	"/tcrwork/linuxController/trunk/TcrController/data/"
#define ROBOT_COMMON_NAME	"/tcrwork/linuxController/trunk/TcrController/data/robotData"
#define ROBOT_PROGRAM_FLODER	"/program/"
#define CONFIG_STRING   "/config/"
#define RSR_CONFIG_NAME "rsrConfig.xml"

#include <iostream>
#include <vector>
#include <QVector>
//#include <Eigen/Dense>
#include <kdl/frames.hpp>

#define CONTROLLER_IPADDRESS    "192.168.1.204"

#define PROGRAM_PATH "/tcrwork/linuxController/trunk/TcrController/data/robotData1/program/"

#define GLOBAL_REG_R_FILE	"/tcrwork/linuxController/trunk/TcrController/data/globalConfig/globalRegFile/r_register.dat"
#define GLOBAL_REG_PR_FILE	"/tcrwork/linuxController/trunk/TcrController/data/globalConfig/globalRegFile/pr_register.dat"
#define GLOBAL_REG_PL_FILE	"/tcrwork/linuxController/trunk/TcrController/data/globalConfig/globalRegFile/pl_register.dat"

#define GLOBAL_FILE_VALUE -1

#define MAX_THREAD  9

#define MICROSECOND_TIME 1000000.0

using namespace Eigen;

using namespace std;


enum POLLCODE_STATUS_TYPE
{
    ENUM_TIME_NORMAL = 100,
    ENUM_TIME_GOING_PASSED,
    ENUM_TIME_PASSED,
    ENUM_SERIAL_UNEQUAL,
    ENUM_REGISTER_NO_EXIST,
    ENUM_POLLCODE_END
};

enum USER_POWER
{
    ENUM_POWER_COMMON_CONSUMER,
    ENUM_POWER_ADMIN,
    ENUM_POWER_END
};

enum MC_CONTROLLER_STATUS
{
    ENUM_STOP = 0,
    ENUM_RUN = 1,
    ENUM_CEASE = 2,
    ENUM_ERROR = 3,
    ENUM_INIT_ERROR = 4//2017.2.16 林逢达添加，初始化失败时的状态
};

enum MC_JOG_COORDINATE
{
    ENUM_JOINT = 0,
    ENUM_TOOL = 1,
    ENUM_USER = 2,//2017.2.21 林逢达修改枚举顺序，与hmi同步
    ENUM_WORLD = 3
};

enum MC_COMMAND
{
    ENUM_COMMAND_JOINT = 0,
    ENUM_COMMAND_LINE = 1,
    ENUM_COMMAND_CIRCLE = 2
};

enum VELOCITY_UNIT
{
    ENUM_RATIO = 0,
    ENUM_MMPS  = 1,
    ENUM_DEGREEPS = 2
};

enum SET_TOOL
{
    ENUM_TOOL_3POINTS = 0,
    ENUM_TOOL_6POINTS = 1,
    ENUM_TOOL_XYZWPR = 2
};

enum SET_USER
{
    ENUM_USER_3POINTS = 0,
    ENUM_USER_4POINTS = 1,
    ENUM_USER_XYZWPR = 2
};

//2017.02.20 lfd添加
enum MC_ROBOT_TYPE//机械臂类型
{
    ENUM_SCARA , //SCARA
    ENUM_6AXIS_CHAIN,//六轴垂直串联
    ENUM_4AXIS_PALLET,//四轴码垛
    ENUM_ROBOT_TYPE_END//不支持类型
};

//enum LANGUAGE_TYPE
//{
//    ENUM_LAN_CHINESE,
//    ENUM_LAN_ENGLISH,
//    ENUM_LAN_END
//};

//点类型
enum POINT_TYPE
{
    ENUM_NORMAL_POINT,
    ENUM_PALLET_POINT,
    ENUM_PR_POINT,
    ENUM_POINT_END
};

//语言类型
enum LANGUAGE_TYPE
{
    ENUM_LAN_CHINESE,//中文
    ENUM_LAN_ENGLISH,//英文
    ENUM_LAN_END
};
//消息级别
enum MSG_LEVEL_TYPE
{
    ENUM_MSG_ERROR,//错误
    ENUM_MSG_WARNING,//警告
    ENUM_MSG_REMIND,//提示
    ENUM_MSG_END
};
//消息、日志类别
enum MESSAGE_TYPE
{
    ENUM_MESSAGE_MSG,//普通消息
    ENUM_MESSAGE_LOG,//写入日志文件
    ENUM_MESSAGE_END
};
//停止类型，2016.12.28.xyf 。改为跟算法枚举一样值  MC_CONTROLLER_STATUS
enum STOP_COMMAND_TYPE
{
    ENUM_COMMAND_RESET,//停止
    ENUM_COMMAND_RUN,//运行
    ENUM_COMMAND_CEASE,//中断
    ENUM_COMMAND_END//err
};
//运动类型,20170111林逢达修改,删除自动
enum MOVE_TYPE
{
    ENUM_MOVE_ORDER_STEP,//单步
    ENUM_MOVE_HAND_SERIES,//连续
    ENUM_MOVE_END
};
//控制模式,20170111林逢达添加
enum CONTROL_TYPE
{
    ENUM_CONTROL_T1,//T1
    ENUM_CONTROL_T2,//T2
    ENUM_CONTROL_AUTO,//自动
    ENUM_CONTROL_EXT,//外部
    ENUM_CONTROL_END
};

//码垛类型
enum STACK_TYPE
{
    ENUM_STACK_B,//B型码垛
    ENUM_STACK_E,//E型码垛
    ENUM_STACK_BX,//BX型码垛
    ENUM_STACK_EX//EX型码垛
};

//码垛点类型
enum STACK_POINT
{
    ENUM_STACK_POINT_BTM=0,
    ENUM_STACK_POINT_AN=1,
    ENUM_STACK_POINT_RN=2,
    ENUM_STACK_POINT_END
};
//steven　启动方式：冷启动、热启动
enum ROBOT_START_TYPE
{
    ROBOT_COOL_START,
    ROBOT_HOT_START,
    ROBOT_END_START
};

enum ROBOT_CMD_TYPE
{
	///全局命令
	POWER_OFF,//关机
    REBOOT,//重启
        

	SAVE_GLOBAL_REG_R,
	SAVE_GLOBAL_REG_PR,
	SAVE_GLOBAL_REG_PL,
	GET_GLOBAL_REG,//全局寄存器
	//EMERGENCY_STOP,
	SCAN_LOG,
	GLOBAL_ROBOT_RESET,//停止 
	GET_GLOBAL_MESSAGE,//获取全局消息
	GET_GLOBAL_CONTROL_VERSION,//将每个动态库的类名以及版本号日期写入xml文件，
	MESSAGE_CLEAR,//消息清除，

    //SHUTDOWN,
    
	///局部命令
    OPEN_PROGRAM_FILE,//打开程序文件
    MANUAL_STEP,//手动单步
	MANUAL_SERIES,//手动连续
	AUTO_RUN,//自动运行
	MANUAL_MOVE,//手动示教移动，要带坐标系参数：关节，笛卡尔，左右手姿态，第几个轴
	ROBOT_RUN,//运行
    ROBOT_RESET,//停止
    ROBOT_CEASE,//暂停
    BUTTON_REALESED,//按键松开
	SET_MANUAL_SPEED,//设置手动速度
    SET_AUTO_SPEED,//设置自动速度
    PROGRAM_CMD_CHANGED,//指令修改，不包括点位数据
  //  PROGRAM_POINT_CHANGED,//点位修改
    PROGRAM_CHANGED,//指令编辑修改，包括点位数据
	CONFIG_CHANGED,//配置信息修改了
    MOVE_TO_POINT,//移动到点,参数：关节/直线
    SERVO_CONTROL,//伺服控制  on/off 等
 	POINT_TYPE_TRANSFORM,//点位数据转换
    COORDINATE_CHANGE,//坐标系更改，参数：1.用户/工具/世界/关节 2.编号
    ACTIVE_COORDINATE,// 参数：1. 用户/工具  2.编号

    SAVE_LOCAL_REG_R,
	SAVE_LOCAL_REG_PR,
	SAVE_LOCAL_REG_PL,
	//EMERGENCY_STOP, 
	GET_LOCAL_REG,//局部寄存器
    	
};


enum TIMER_REG_PROCESS_TYPE
{
    TIMER_REG_PROCESS_STOP,
    TIMER_REG_PROCESS_START,
    TIMER_REG_PROCESS_RESET,
    TIMER_REG_PROCESS_REG
};

enum CONTROLLER_STATUS_TYPE
{
    CONTROLLER_POWER_OFF,
    CONTROLLER_POWER_ON,
    CONTROLLER_STATUS_END
};


#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The ControllerIpGroupInfo struct      控制器ｉｐ组信息
 */
struct ControllerIpGroupInfo
{
    std::string ipAddress;///ｉｐ地址
    std::string gateWay;///网关
    std::string dnsServer;///ｄｎｓ服务器
};
#endif

/**
 * @brief The MultiThreadInfo struct    多任务属性结构体
 */
struct MultiThreadInfo
{
    std::string componentName;  ///组件实例名
    std::string runningFileName;///running文件名
    int lineNum;                ///当前的行号
    std::vector<int> breakPointNum;///断点的行号
};

/**
 * @brief The FileInfo struct      文件信息
 */
struct FileInfo
{
    std::string programName;//程序名称
    std::string owner;//程序创建者
    std::string comment;//注释
    int programSize;//程序大小
    std::string createTime;//创建时间
    std::string modifiTime;//修改时间
    std::string fileName;//程序名称
    std::string version;//程序版本
    int lineCount;      //行数
    int memorySize;
    std::string protectPro;

    int templateType;//中英文模式

    int tcdStackSize;
    int tcdTaskPriority;
    int tcdTimeSlice;
    int tcdBusyLampOff;
    int tcdAbortRequest;
    int tcdPauseRequest;

    std::string defaultGroup;
    std::string controlCode;
};

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The PointPro struct       点信息
 */
struct PointPro
{
    int jointFlag;                  //0:关节;1:笛卡尔;
    int pointNum;                   //点 编号
    int groupNum;                   //组 编号
    int ufValue;                    //用户坐标系 编号
    int utValue;                    //工具坐标系 编号
    int recordStatus;                  //在使用用户坐标系，或者是工具坐标系进行坐标系示教的时候（三点法，四点法，六点法），记录该点的示教状态，０代表未示教　　１代表已经示教
    std::string configString;       //多解 选择;多圈 选择
    std::vector<int> configInt;     //多解 选择;多圈 选择
    std::vector<float> positionValue;//关节值 or 笛卡尔值
    std::vector<float> extPositionValue;//外部轴的值，仅存在关节形式
};
#endif

/**
 * @brief The StackStylePointInfo class     保存示教点信息
 **/
struct StackStylePointInfo
{
    /**
     * @brief m_nMatrix 堆上示教点位置 【1，2，2】 【R，C，L】【GCODE_STACK_POSITION_RCL_COUNT】
     **/
    std::vector <int> rowColumnLayer;
    /**
     * @brief m_sStackPoint 点位信息
     **/
    PointPro stackPoint;
};

/**
 * @brief The StackInfo class  码垛初始信息
 **/
struct StackInfo
{
    /**
     * @brief stackName 码垛名称
     **/
    std::string stackName;
    /**
     * @brief m_nStackUpDown    堆上、堆下【种类：码垛、拆垛】0码垛 1拆垛；
     **/
    int stackUpDown;
    /**
     * @brief m_nRow    行数
     **/
    int row;
    /**
     * @brief m_nCol    列数
     **/
    int col;
    /**
     * @brief m_nLayer  层数
     **/
    int layer;
    /**
     * @brief m_nExecIncr   增加，1:增加,-1:减少
     **/
    int execIncr;
    /**
     *@brief m_nAuxiliary   是否有辅助点
     */
    int auxiliary;
    /**
     * @brief m_nExecOrder  执行顺序 【CRL、RCL】0:行列层、1:列行层
     **/
    int execOrder;
    /**
     * @brief m_nTeachOrder 示教顺序：1，底层示教；0顶层示教【方向】
     **/
    int teachOrder;
    /**
     * @brief m_nIntervalEnable 行列层三点示教是否开启：1，开启；0，关闭【开关】正常情况处于关闭状态
     **/
    std::vector <int> intervalEnable;
    /**
     * @brief m_nIntervalValue  行列层间距值【间距值】当行列层三点示教开启时，可以通过间距值从而减少需要示教的点位信息
     **/
    std::vector <float> intervalValue;
    /**
     * @brief m_nStackType  码垛类型：B、BX、E、EX
     **/
    int stackType;
    /**
     * @brief m_nStackNumber    叠栈号码
     */
    int stackNumber;
    /**
     * @brief m_nStackProximityCount    接近点数
     **/
    int stackProximityCount;
    /**
     * @brief m_nStackFleeCount 逃离点数
     **/
    int stackFleeCount;
    /**
     * @brief m_nStackStyleCount    式样点数
     **/
    int stackStyleCount;
    /**
     * @brief m_nStackRegister  栈板寄存器号码
     **/
    int stackRegisterNumber;
    /**
     * @brief m_nStackPointCount    堆上示教点个数
     **/
    int stackPointCount;
    /**
     * @brief m_nStackFinishOutputMode  码垛完成信号输出模式
     **/
    int stackFinishOutputMode;
    /**
     * @brief m_nStackFinishOutputDoNum 码垛完成信号输出DO号
     **/
    int stackFinishOutputDoNum;
    /**
     * @brief stackPointA_n 接近点
     **/
    std::vector <PointPro> stackPointA_n;
    /**
     * @brief stackPointBTM 堆叠点
     **/
    PointPro stackPointBTM;
    /**
     * @brief stackPointR_n 逃离点
     **/
    std::vector <PointPro> stackPointR_n;
    /**
     * @brief m_sStackStylePointInfo    示教点信息
     **/
    std::vector <StackStylePointInfo> stackStylePointInfo;
};

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief 码垛点结构体。华磊修改。
 */
struct PalletPoint
{
    int palletNumber; //码垛号
    int pointType;  	  //点类型0 堆栈点。1 接近点。 2 逃离点。
    int pointNumber;  //接近点号 或 逃离点号
    std::vector<int> rowColumnLayer;//行列层
};
#endif

/**
 * @brief The JointAttribute struct 关节属性
 */
struct JointAttribute
{
    /**
     * @brief jointName 关节名称，林逢达添加
     */
    std::string jointName;//在公共目录下，使用std::string
	/**
     * @brief jointType 关节类型
     * ０    旋转关节
     * １    移动关节
     */
    int jointType;
    /**
     * @brief dhType
     * 0    standard dh
     * 1    modified dh
     */
    int dhType;//林逢达添加　dh参数类型
    /**
     * @brief dhParameter
     * \sita    Z轴之间的夹角
     * \d       Z轴方向的偏移量
     * \a       X轴方向的偏移量
     * \alpha   X轴之间的夹角
     */
    double dhParameter[4];//林逢达修改　把原来的QVector<float>dhParameter改为double dhParameter[4]
    //林逢达修改　把原来的QVector<float>positionVary改为两个变量maxPosition和minPosition
    /**
     * @brief maxPosition 电机转角/位移最大值，单位角度/mm
     */
    float maxPosition;
    /**
     * @brief minPosition 电机转角/位移最小值，单位角度/mm
     */
    float minPosition;
    /**
     * @brief positionOffset 电机位置偏移
     */
    float positionOffset;
    /**
     * @brief maxVelocity 最大转速
     */
    float maxVelocity;
    /**
     * @brief maxToeque 最大转矩
     */
    float maxToeque;
    /**
     * @brief maxAccelation 最大加速度
     */
    float maxAccelation;
    /**
     * @brief mass 关节质量
     */
    float mass;
    /**
     * @brief massCenter 关节质心
     * x y z
     */
    QVector<float>massCenter;
    /**
     * @brief inertiaMatrix 惯性张量矩阵
     * Ixx Iyy Izz Ixy Ixz Iyz
     */
    QVector<float>inertiaMatrix;
    /**
     * @brief viscousFriction 粘性摩擦常量
     */
    float viscousFriction;
    /**
     * @brief coulombFriction 库伦摩擦常量
     */
    float coulombFriction;
    /**
     * @brief mobile 能否转动
     * true 能转动
     * false 不能转动
     */
    bool mobile;
    /**
     * @brief gearRatio 电机齿轮比
     */
    float gearRatio;
    /**
     * @brief screwPitch 螺距，单位毫米
     */
    float screwPitch;
    /**
     * @brief encoderResolution 电机编码器位数
     */
    int encoderResolution;
    /**
     * @brief pulsePerRound 电机一圈的脉冲数，初始化时计算
     */
    int pulsePerRound;//林逢达添加
    /**
     * @brief coupleFlag 耦合标记,其他关节是否对其产生作用
     */
    bool coupleFlag;
    /**
     * @brief coupleJoint 耦合作用的关节索引(该索引为原始影响关节)，从0开始
     */
    int coupleJoint;
    /**
     * @brief coupleReducer 对耦合作用有影响的减速比（关节　影响　关节。关节　影响　直线。　该参数２种情况都适用。正负关联补偿方向。关节　影响　直线　的情况，参数为-1 或１。）
     */
    float coupleReducer;
    /**
     * @brief 外部轴标识,是否外部轴, 0:内部轴 1:外部轴
     */
    int externAxisFlag;
    /**
     * @brief 指令精确到达的目标点允许误差
     */
    int targetFollowError;//20170110LFD改为int，单位是脉冲
    /**
     * @brief 跟隨過程最大允许误差
     */
    int processFollowError;//2017011LFD添加，单位是脉冲
};

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief MoveParamater 移动参数
 */
struct MoveParameter
{
    int moveType;			//关节、直线、圆弧
    int velocityUnit;		//单位　０是百分比　１是mm/s　２是°/s
    float velocity;			//指令里面的速度值	
    PointPro targetPoint;//hmiAPI_update20161107.h
    PalletPoint palletPoint;
    int pointType;//0 普通P点, 1 码垛点, 2　PR寄存器点（华磊修改）
    int index;				//点的编号pointNum
    int cntRatio;			//cnt
    float acc;               // 加速度 类型改为float,单位是百分比
    int lineNumber;        //行号
    int wjnt;   //姿态是否控制, 直线或者圆弧时对机械手腕姿态是否进行控制
    int poseOffset;//0 正常，　１　直接补偿
    int poseOffsetIndex; //直接补偿PR[]
    int  toolOffset;//0 正常，　１　直接补偿
    int toolOffsetIndex; //直接补偿PR[]
    int incFlag;//0 正常，　１增量运动
    int evFlag;//附加轴运动标识。
    int evVelocity;//0-100附加轴速度比例
    int pathFlag;//路径规划曲线标识

};
#endif

/**
 * @brief ToolCoordinateInformation 工具坐标系信息
 */
struct ToolCoordinateInfo
{
    int index;
    float error;
    int method;
    QVector<PointPro> pointList;
    QVector<float>  xyzwpr; //华磊增加，法兰到TCP
    KDL::Frame forwardTcpMatrix;//从法兰到TCP
    KDL::Frame inverseTcpMatrix;//从TCP到法兰
};

/**
 * @brief UserCoordinateInformation 用户坐标系信息
 */
struct UserCoordinateInfo
{
    int index;
    int method;
    QVector<PointPro> pointList;
    QVector<float>  xyzwpr; //华磊增加，从世界坐标原点到用户原点
    KDL::Frame forwardTcpMatrix;//从世界坐标原点到用户坐标原点
    KDL::Frame inverseTcpMatrix;//从用户坐标原点到世界坐标原点
};

struct JointData
{
    float position;//位置 　（deg 或　mm）
    float speed;//速度　　（deg/s或　mm/s)
    float torque;//力矩       (N.M)
};

struct MotorData
{
    int position;//位置 　　（  puls编码器单位）
    int speed;//速度　　     （puls/s)
    int torque;//力矩             (%)
};

//struct MotorCommand
//{
//    float motorPosition;
//    float motorVelocity;
//    float motorTorque;
//    float motorAcceleration;
//};

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
struct UserInfo
{
    int account;                    //用户ID
    std::string password;           //密码
    std::string ip;                 //IP地址
    std::string operationSystem;    //操作系统
};
#endif

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The Message struct        信息结构体
 */
struct Message
{
    int MessageLevel;               //消息级别
    std::string time;               //产生时间
    int robotId;                    //机器人Ｉｄ
    string componentClassName; //组件类名
    string messageType;        //消息类型
    int messageCode;                //消息ID
    int parameter1;                 //消息参数1
    int parameter2;                 //消息参数2
    int parameter3;         //消息参数3
    int parameter4;         //消息参数4
    string MessageInformation; //消息内容(提供用户可见)
};
#endif

///**
// * @brief The CurrentRunFile struct 当前运行程序
// */
//struct CurrentRunFile
//{
//    std::vector<std::string> runingFileName;     //当前运行程序名
//    std::vector<int> runningFileLine;            //当前运行行号
//};

/**
 * @brief The CurrentRunFile struct 当前运行程序
 */
//struct CurrentRobotRunFile
//{
//    vector <std::string> runningFileName;      //当前运行的程序名
//    vector <int> runningFileLine;              //当前运行行号
//    vector <std::string> relatedFileName;      //关联文件名
//};

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The ComponentVersion struct   组件版本
 */
struct ComponentVersion
{
    string componentName;               //组件名
    string componentVersion;            //组件版本
    string publishDate;                 //发布时间
};
#endif

///**
// * @brief The PrRegStruct struct            ｐｒ寄存器
// */
//struct PrRegStruct
//{
//    int jointFlag; //0:关节;1:笛卡尔;
//    std::vector <float> prValue;//pr寄存器的值

//};

#ifndef soapStub_H
/*
  2016-12-21.xyf
　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The PlRegStruct struct    pl寄存器
 */
struct PlRegStruct
{
    int row;//行
    int col;//列
    int layer;//层

};
#endif

//#include "globalDefine.h"
#endif
